﻿#ifndef NosepieceOlympusCBFM_H
#define NosepieceOlympusCBFM_H

#include "../NosepieceCommon/NosepieceInterface.h"

#include <QtCore/QObject>
#include <QtCore/QSettings>
#include <QtSerialPort/QtSerialPort>

extern "C"
{
NOSEPIECE_EXPORT Qly::NosepieceInterface * CreateInstance(QObject *parent);
NOSEPIECE_EXPORT void Release(Qly::NosepieceInterface * p);
}

namespace Qly
{
/**
 * @brief The NosepieceOlympusCBFM class 奥林巴斯物镜转盘控制器 CBFM 的控制代码。
 *                CBFM 功能很多。这里只支持几条命令。
 *                （1） 切换为远程控制： 1L 2\r\n  ， 返回  1L +\r\n
 *                （2） 切换回本地控制：1L 0\r\n, 返回 1L +\r\n
 *                （3） 1OB n\r\n  切换到 物镜 n
 *
 */
class NOSEPIECE_EXPORT NosepieceOlympusCBFM : public NosepieceInterface
{
    Q_OBJECT
public:

    enum ModelType {U5RES_ESD = 1, D6RES = 2, D5BDREMC = 5, D6REMC = 6, D6BDREMC = 7};
    explicit NosepieceOlympusCBFM(QObject *parent = nullptr);
    ~NosepieceOlympusCBFM() override;
    /**
     * @brief setLensCount
     * @param N
     */
    void setModelType(enum ModelType model);

public slots:
    /**
     * @brief setLens 设置物镜转盘转到第 n 个物镜位置
     * @param n n 为 从 0 到 4 数字分别代表第 1 个到 第 5 个物镜
     */
    void setLens(int n) override;
    /**
     * @brief setLens 设置物镜转盘转到第 n 个物镜位置
     * @param oldLens 当前物镜的位置，从 0 开始
     * @param newLens 新物镜，从 0 开始
     */
    void setLens(int oldLens, int newLens) override;
    /**
     * @brief forward 切换到下一个物镜
     */
    void forward() override;
    /**
     * @brief reverse 切换到上一个物镜
     */
    void reverse() override;
    void writeSettings(QSettings &settings) override;
    void loadSettings(QSettings &settings) override;
    void login();
private:
    enum ModelType m_type;
    int m_maxLens = 6;
    QSerialPort * m_serialPort;
    QString m_comPort;
    int m_baudRate;
    int m_dataBits;
    int m_parity;
    int m_stopBits;

    void cmd(QString str);
};
}



#endif // NosepieceOlympusCBFM_H
